﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static UnityEngine.EventSystems.EventSystem;

public class CombineMesh : MonoBehaviour
{
    void Start()
    {
        MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter> ();//获取所有子物体的网格
        CombineInstance[] combine = new CombineInstance[meshFilters.Length];//新建一个合并组，长度与 meshfilters一致
        Material[] mats = new Material[meshFilters.Length];
        Matrix4x4 matrix = transform.worldToLocalMatrix;
        for (int i = 0; i < meshFilters.Length; i++) {//遍历
            MeshFilter mf = meshFilters [i];
            MeshRenderer mr = meshFilters [i].GetComponent<MeshRenderer> ();
            if (mr == null) {
                continue;
            }
            combine[i].mesh = mf.sharedMesh;//将共享Mesh赋值
            combine[i].transform = matrix * mf.transform.localToWorldMatrix;//将本地坐标转矩阵，赋值
           // combine[i].subMeshIndex = i;
            mr.enabled = false;//关闭网格渲染
            mats [i] = mr.sharedMaterial;//材质
        }
        MeshFilter thisMeshFilter = GetComponent<MeshFilter> ();
        Mesh mesh = new Mesh ();
        mesh.name = "Combined";
        thisMeshFilter.mesh = mesh;
//        CombineMeshes有三个参数：
//        combine:CombineInstance（struct）类型的数组，这个结构里包括了需要合并的网格（mesh），子网格的索引（subMeshIndex）和转换矩阵（transform）。
//        mergeSubMeshes:bool值，是否需要将所有的Mesh合并成一个。
//        useMatrices:bool值，是否使用矩阵，如果为false，那么CombineInstance里的transform将会被忽略。
//
//       如果本对象和所有子对象都是用的相同的材质和纹理的话，那么这段代码就需要整理一下了，把Material相关的二代吗去掉即可，然后CombineMesh的第二个要改为true
        mesh.CombineMeshes (combine, true,true);
        
        MeshRenderer thisMeshRenderer = GetComponent<MeshRenderer> ();
        thisMeshRenderer.sharedMaterials = mats;
        thisMeshRenderer.enabled = true;
 
        MeshCollider thisMeshCollider = GetComponent<MeshCollider> ();
        if (thisMeshCollider != null) {
            thisMeshCollider.sharedMesh = mesh;
        }
 
    }

}
